// indexOf()方法返回在数组中可以找到一个给定元素的第一个索引，如果不存在，则返回-1。
// 在新数组使用indexOf监测新数组是否存在与原数组相同的值对比
// function reSetArr(arr) {
//     let array = [];
//     for (let i = 0; i < arr.length; i++) {
//         if (array.indexOf(arr[i]) === -1) {
//             array.push(arr[i])
//         }
//     }
//     console.log(`array`, array)
//     return array;
// }

// 这种思维方法还可以用includes()方法实现
// function reSetArr(arr) {
//     let array = [];
//     for (let i = 0; i < arr.length; i++) {
//         if (!array.includes(arr[i])) {//includes 检测数组是否有某个值
//             array.push(arr[i]);
//         }
//     }
//     console.log(`array`, array)
//     return array;
// }

// 不考虑兼容性这个方法挺好的，代码少
// Array.from() 方法从一个类似数组或可迭代对象创建一个新的，浅拷贝的数组实例。
// new Set([iterable])如果传递一个可迭代对象，它的所有元素将不重复地被添加到新的 Set中。如果不指定此参数或其值为null，则新的 Set为空。
// function reSetArr (arr) {
//     console.log(Array.from(new Set(arr)));
//     return Array.from(new Set(arr))
//   }

// hasOwnProperty() 方法会返回一个布尔值，指示对象自身属性中是否具有指定的属性（也就是，是否有指定的键）
// function reSetArr(arr) {
//     let obj = {};
//     return arr.filter(item=>{
//         return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
//     })
// }

// filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
// function reSetArr(arr) {
//     let obj = {};
//     return arr.filter((item, index, arr) => {
//         //当前元素，在原始数组中的第一个索引==当前索引值，否则返回当前元素
//         console.log(arr.indexOf(item) === index )
//         return arr.indexOf(item) === index;
//     });
// }

// 创建一个空Map数据结构，遍历需要去重的数组，把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值，所以最终得到的就是去重后的结果。
function reSetArr(arr){
    let map = new Map();
    let array = new Array();  // 数组用于返回结果
    for (let i = 0; i < arr.length; i++) {
        if(map.has(arr[i])) {  // 如果有该key值
            map.set(arr[i], true);
        } else {
            map.set(arr[i], false);   // 如果没有该key值
            array.push(arr[i]);
        }
    }
    return array ;
}
// 测试数组
let arr = ['1', 1, 1, undefined, null, true, false, true, false, {}, {}, [], [], '1', null, 1]

console.log(`去重后的数组`, reSetArr(arr))